package question;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @program: javase
 * @description: 三个线程交替打印到100
 * @author: lld
 * @create: 2021-06-07 19:47
 **/
public class Question5 {
//    private int n = 1;//标志位

    //    public synchronized void print1(int num) throws InterruptedException {
////        判断等待
//        if (n != 1) wait();
//        if (num % 3 == 1) {
//            System.out.println(Thread.currentThread().getName() + ": " + num);
//
//        }
////        唤醒
//        n = 2;
//        notifyAll();
//    }
//
//    public synchronized void print2(int num) throws InterruptedException{
////        判断等待
//        if (n != 2) wait();
//        if (num % 3 == 2) {
//            System.out.println(Thread.currentThread().getName() + ": " + num);
//
//        }
////        唤醒
//        n = 3;
//        notifyAll();
//    }
//
//    public synchronized void print3(int num) throws InterruptedException {
////        判断等待
//        if (n != 3) wait();
//        if (num % 3 == 0) {
//            System.out.println(Thread.currentThread().getName() + ": " + num);
//
//        }
////        唤醒
//        n = 1;
//        notifyAll();
//    }
//
//    public static void main(String[] args) {
//        Question5 question3 = new Question5();
//        Thread t1 = new Thread(() -> {
//            try {
//                for (int i = 1; i <= 10; i++) {
//                    question3.print1(i);
//                }
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }, "1线程");
//
//        Thread t2 = new Thread(() -> {
//            try {
//                for (int i = 1; i <= 10; i++) {
//                    question3.print2(i);
//                }
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }, "2线程");
//        Thread t3 = new Thread(() -> {
//            try {
//                for (int i = 1; i <= 10; i++) {
//                    question3.print3(i);
//                }
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }, "3线程");
//
////
//        t1.start();
//        t2.start();
//        t3.start();
////        main线程最后执行
//        try {
//            t1.join();
//            t2.join();
//            t3.join();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        System.out.println("print finished");
//    }
    private static int n = 1;
    private static Object object = new Object();
    private static ReentrantLock lock=new ReentrantLock();

    public static void main(String[] args) {
//        new Thread(() -> {
//            while (n < 100) {
//                synchronized (object) {
//                    if (n % 3 == 1) {
//                        System.out.println(Thread.currentThread().getName() + " " + 1);
//                        n++;
//                    }
//                }
//            }
//        }, "A").start();
//        new Thread(() -> {
//            while (n < 100) {
//                synchronized (object) {
//                    if (n % 3 == 2){
//                        System.out.println(Thread.currentThread().getName() + " " + 2);
//                    n++;
//
//                    }
//                }
//            }
//        }, "B").start();
//        new Thread(() -> {
//            while (n < 100) {
//                synchronized (object) {
//                    if (n % 3 == 0){
//                        System.out.println(Thread.currentThread().getName() + " " + 3);
//                        n++;
//                    }
//                }
//            }
//        }, "C").start();
        new Thread(() -> {
            while (n < 100) {
                lock.lock();
                if (n % 3 == 1){
                    System.out.println(Thread.currentThread().getName() + " " + 1);
                    n++;
                }
                lock.unlock();
            }
        }, "A").start();
        new Thread(() -> {
            while (n < 100) {
                lock.lock();
                if (n % 3 == 2){
                    System.out.println(Thread.currentThread().getName() + " " + 2);
                    n++;
                }
                lock.unlock();
            }
        }, "B").start();
        new Thread(() -> {
            while (n < 100) {
                lock.lock();
                if (n % 3 == 0){
                    System.out.println(Thread.currentThread().getName() + " " + 3);
                    n++;
                }
                lock.unlock();
            }
        }, "C").start();
    }
}
